Atskleiskite Scikit-learn išankstinio duomenų apdorojimo galią su duomenų transformacijos konvejeriais. Išmokite kurti patikimas ir efektyvias mašininio mokymosi darbo eigas optimaliam modelio veikimui.
Scikit-learn išankstinis duomenų apdorojimas: duomenų transformacijos konvejerių įvaldymas mašininiam mokymuisi
Mašininio mokymosi srityje jūsų duomenų kokybė tiesiogiai veikia jūsų modelių našumą. Neapdorotuose duomenyse dažnai būna neatitikimų, trūkstamų verčių ir skirtingų mastelių, todėl jie netinkami tiesioginiam naudojimui. Scikit-learn, galinga Python biblioteka, suteikia platų išankstinio duomenų apdorojimo metodų rinkinį, skirtą transformuoti jūsų duomenis į formatą, tinkamą mašininio mokymosi algoritmams. Šiame straipsnyje gilinamasi į Scikit-learn išankstinio duomenų apdorojimo pasaulį, daugiausia dėmesio skiriant duomenų transformacijos konvejerių kūrimui ir naudojimui, siekiant supaprastinti jūsų mašininio mokymosi darbo eigas.
Kodėl duomenų išankstinis apdorojimas yra kritiškai svarbus
Duomenų išankstinis apdorojimas – tai neapdorotų duomenų valymo, transformavimo ir organizavimo procesas, siekiant juos pritaikyti mašininio mokymosi modeliams. Tai gyvybiškai svarbus žingsnis, nes mašininio mokymosi algoritmai yra jautrūs įvesties požymių masteliui ir pasiskirstymui. Be tinkamo išankstinio apdorojimo modeliai gali veikti prastai, o tai lemia netikslias prognozes ir nepatikimus rezultatus. Štai keletas pagrindinių priežasčių, kodėl duomenų išankstinis apdorojimas yra būtinas:
- Geresnis modelio našumas: Iš anksto apdoroti duomenys leidžia modeliams efektyviau mokytis ir pasiekti didesnį tikslumą.
- Tvarkomos trūkstamos vertės: Imputacijos metodai užpildo trūkstamus duomenų taškus, neleisdami algoritmams strigti ar duoti šališkų rezultatų.
- Standartizuojami požymių masteliai: Mastelio keitimo metodai užtikrina, kad visi požymiai vienodai prisidėtų prie modelio, neleidžiant požymiams su didesnėmis vertėmis dominuoti mokymosi procese.
- Koduojami kategoriniai kintamieji: Kodavimo metodai paverčia kategorinius duomenis į skaitines reikšmes, kurias mašininio mokymosi algoritmai gali suprasti.
- Mažinamas triukšmas ir išskirtys: Išankstinis apdorojimas gali padėti sumažinti išskirčių ir triukšmingų duomenų poveikį, todėl modeliai tampa patikimesni.
Įvadas į Scikit-learn konvejerius
Scikit-learn konvejeriai (Pipelines) suteikia būdą sujungti kelis duomenų transformacijos žingsnius į vieną, pakartotinai naudojamą objektą. Tai supaprastina jūsų kodą, pagerina skaitomumą ir apsaugo nuo duomenų nutekėjimo modelio vertinimo metu. Konvejeris iš esmės yra duomenų transformacijų seka, po kurios eina galutinis vertintuvas (pvz., klasifikatorius ar regresorius). Štai kodėl konvejeriai yra tokie naudingi:
- Kodo organizavimas: Konvejeriai apgaubia visą duomenų išankstinio apdorojimo ir modeliavimo darbo eigą į vieną vienetą, todėl jūsų kodas tampa tvarkingesnis ir lengviau prižiūrimas.
- Duomenų nutekėjimo prevencija: Konvejeriai užtikrina, kad duomenų transformacijos būtų nuosekliai taikomos tiek mokymo, tiek testavimo duomenims, taip išvengiant duomenų nutekėjimo, kuris gali sukelti perteklinį pritaikymą ir prastą apibendrinimą.
- Supaprastintas modelio vertinimas: Su konvejeriais lengviau įvertinti modelio našumą naudojant tokius metodus kaip kryžminis patvirtinimas, nes visa išankstinio apdorojimo ir modeliavimo darbo eiga nuosekliai taikoma kiekvienam pogrupiui.
- Efektyvesnis diegimas: Konvejerius galima lengvai įdiegti į produkcines aplinkas, užtikrinant, kad duomenys būtų iš anksto apdorojami taip pat, kaip ir mokymo metu.
Dažniausios duomenų išankstinio apdorojimo technikos Scikit-learn bibliotekoje
Scikit-learn siūlo platų išankstinio apdorojimo metodų spektrą. Štai keletas dažniausiai naudojamų:
1. Mastelio keitimas ir normalizavimas
Mastelio keitimas ir normalizavimas yra technikos, naudojamos skaitinių požymių transformavimui į panašų verčių diapazoną. Tai svarbu, nes skirtingo mastelio požymiai gali neproporcingai paveikti mokymosi procesą. Scikit-learn siūlo keletą mastelio keitimo ir normalizavimo metodų:
- StandardScaler: Standartizuoja požymius, pašalindamas vidurkį ir keisdamas mastelį iki vienetinės dispersijos. Tai plačiai naudojama technika, kuri daro prielaidą, kad duomenys pasiskirstę pagal normalųjį skirstinį.
Formulė:
x_scaled = (x - vidurkis) / standartinis_nuokrypisPavyzdys: Tarkime, turite namų kainas USD ir plotą kvadratinėmis pėdomis. Šių požymių mastelio keitimas užtikrina, kad modelis neteiks nepagrįstos svarbos požymiui su didesnėmis vertėmis (pvz., namų kainoms).
- MinMaxScaler: Keičia požymių mastelį į nurodytą diapazoną, paprastai nuo 0 iki 1. Tai naudinga, kai norite išsaugoti pradinį duomenų pasiskirstymą.
Formulė:
x_scaled = (x - min) / (max - min)Pavyzdys: Vaizdų apdorojime dažnai naudojamas MinMaxScaler pikselių verčių normalizavimui į [0, 1] diapazoną.
- RobustScaler: Keičia požymių mastelį naudojant statistiką, kuri yra atspari išskirtims, pavyzdžiui, medianą ir tarpkvartilinį plotį (IQR). Tai geras pasirinkimas, kai jūsų duomenyse yra išskirčių.
Formulė:
x_scaled = (x - mediana) / IQRPavyzdys: Finansiniuose duomenų rinkiniuose, kur išskirtys yra dažnos (pvz., ekstremalūs akcijų rinkos svyravimai), RobustScaler gali suteikti stabilesnių rezultatų.
- Normalizer: Normalizuoja imtis individualiai iki vienetinės normos. Tai naudinga, kai požymių vektoriaus dydis yra svarbesnis nei atskiros požymių vertės.
Formulė (L2 norma):
x_scaled = x / ||x||Pavyzdys: Teksto apdorojime normalizuoti terminų dažnio-atvirkštinio dokumentų dažnio (TF-IDF) vektorius yra įprasta praktika.
2. Kategorinių kintamųjų kodavimas
Mašininio mokymosi algoritmai paprastai reikalauja skaitinės įvesties, todėl kategorinius kintamuosius reikia paversti skaitinėmis reikšmėmis. Scikit-learn siūlo keletą kodavimo metodų:
- OneHotEncoder: Sukuria dvejetainius stulpelius kiekvienai požymio kategorijai. Tai tinka nominaliems kategoriniams požymiams (požymiams be prigimtinės tvarkos).
Pavyzdys: Koduojant „šalies“ požymį su vertėmis kaip „JAV“, „Kanada“ ir „JK“, būtų sukurti trys nauji stulpeliai: „šalis_JAV“, „šalis_Kanada“ ir „šalis_JK“.
- OrdinalEncoder: Priskiria sveikąją vertę kiekvienai kategorijai pagal jos tvarką. Tai tinka eiliniams (ordinaliems) kategoriniams požymiams (požymiams su prasminga tvarka).
Pavyzdys: Koduojant „išsilavinimo lygio“ požymį su vertėmis kaip „Vidurinis“, „Bakalauras“ ir „Magistras“, būtų priskirtos sveikosios vertės, pvz., atitinkamai 0, 1 ir 2.
- LabelEncoder: Koduojanti tikslines žymes su vertėmis nuo 0 iki n_klasių-1. Naudokite tai tiksliniam kintamajam koduoti klasifikavimo problemose.
Pavyzdys: Koduojant „šlamštas“ ir „ne šlamštas“ žymes atitinkamai kaip 0 ir 1.
- TargetEncoder (reikalinga category_encoders biblioteka): Koduojanti kategorinius požymius pagal tikslinio kintamojo vidurkį kiekvienai kategorijai. Gali sukelti tikslinio kintamojo nutekėjimą, jei nenaudojamas atsargiai kryžminio patvirtinimo metu.
3. Trūkstamų verčių tvarkymas
Trūkstamos vertės yra dažna problema realaus pasaulio duomenų rinkiniuose. Scikit-learn suteikia metodų trūkstamoms vertėms imputuoti (užpildyti):
- SimpleImputer: Imputuoja trūkstamas vertes naudojant konstantą, vidurkį, medianą arba dažniausiai pasitaikančią požymio vertę.
- KNNImputer: Imputuoja trūkstamas vertes naudojant k-artimiausių kaimynų algoritmą. Jis suranda k artimiausių imčių imčiai su trūkstamomis vertėmis ir naudoja tų kaimynų vidutinę vertę trūkstamai vertei imputuoti.
- IterativeImputer: Imputuoja trūkstamas vertes naudojant iteracinį modeliavimo metodą. Kiekvienas požymis su trūkstamomis vertėmis modeliuojamas kaip kitų požymių funkcija, o trūkstamos vertės prognozuojamos iteraciškai.
4. Požymių transformacija
Požymių transformacija apima naujų požymių kūrimą iš esamų. Tai gali pagerinti modelio našumą, užfiksuojant netiesinius ryšius ar sąveikas tarp požymių. Kai kurios technikos apima:
- PolynomialFeatures: Generuoja polinomines požymių kombinacijas. Pavyzdžiui, jei turite du požymius x1 ir x2, PolynomialFeatures gali sukurti naujus požymius, tokius kaip x1^2, x2^2, x1*x2.
- FunctionTransformer: Taiko pasirinktinę funkciją požymiams. Tai leidžia atlikti savavališkas transformacijas, pavyzdžiui, logaritmines ar eksponentines transformacijas.
- PowerTransformer: Taiko laipsninę transformaciją, kad duomenys taptų panašesni į Gauso skirstinį. Tai gali būti naudinga algoritmams, kurie daro prielaidą apie normalumą, pavyzdžiui, tiesinei regresijai. (Apima Box-Cox ir Yeo-Johnson transformacijas)
Duomenų transformacijos konvejerių kūrimas su Scikit-learn
Dabar pritaikykime šias išankstinio apdorojimo technikas praktiškai, kurdami duomenų transformacijos konvejerius. Štai žingsnis po žingsnio vadovas:
1. Importuokite reikalingas bibliotekas
Pradėkite importuodami reikalingas bibliotekas iš Scikit-learn:
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, OneHotEncoder, SimpleImputer
from sklearn.compose import ColumnTransformer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
import pandas as pd
2. Įkelkite ir paruoškite savo duomenis
Įkelkite savo duomenų rinkinį naudodami pandas ar bet kurį kitą tinkamą metodą. Nustatykite skaitinius ir kategorinius požymius savo duomenų rinkinyje. Pavyzdžiui:
data = {
'age': [25, 30, 35, 40, 45, None],
'country': ['USA', 'Canada', 'USA', 'UK', 'Canada', 'USA'],
'salary': [50000, 60000, 70000, 80000, 90000, 55000],
'purchased': [0, 1, 0, 1, 0, 1]
}
df = pd.DataFrame(data)
3. Apibrėžkite išankstinio apdorojimo žingsnius
Sukurkite išankstinio apdorojimo transformatorių, kuriuos norite naudoti, egzempliorius. Pavyzdžiui, tvarkant skaitinius požymius galite naudoti StandardScaler ir SimpleImputer. Kategoriniams požymiams galite naudoti OneHotEncoder. Apsvarstykite galimybę įtraukti strategijas trūkstamoms vertėms tvarkyti prieš keičiant mastelį ar koduojant.
numerical_features = ['age', 'salary']
categorical_features = ['country']
numerical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='mean')),
('scaler', StandardScaler())
])
categorical_transformer = Pipeline(steps=[
('onehot', OneHotEncoder(handle_unknown='ignore'))
])
4. Sukurkite ColumnTransformer
Naudokite ColumnTransformer, kad pritaikytumėte skirtingus transformatorius skirtingiems savo duomenų stulpeliams. Tai leidžia atskirai apdoroti skaitinius ir kategorinius požymius.
preprocessor = ColumnTransformer(
transformers=[
('num', numerical_transformer, numerical_features),
('cat', categorical_transformer, categorical_features)
])
5. Sukurkite konvejerį
Sukurkite Pipeline objektą, kuris sujungia išankstinio apdorojimo žingsnius su mašininio mokymosi modeliu. Tai užtikrina, kad duomenys būtų nuosekliai apdorojami prieš patenkant į modelį.
pipeline = Pipeline(steps=[('preprocessor', preprocessor),
('classifier', LogisticRegression())])
6. Apmokykite ir įvertinkite modelį
Padalinkite savo duomenis į mokymo ir testavimo rinkinius. Tada apmokykite konvejerį su mokymo duomenimis ir įvertinkite jo našumą su testavimo duomenimis.
X = df.drop('purchased', axis=1)
y = df['purchased']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
pipeline.fit(X_train, y_train)
score = pipeline.score(X_test, y_test)
print(f'Model accuracy: {score}')
Visas pavyzdinis kodas
Štai visas kodas, skirtas duomenų transformacijos konvejerio kūrimui ir mokymui:
import pandas as pd
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, OneHotEncoder, SimpleImputer
from sklearn.compose import ColumnTransformer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
# Pavyzdiniai duomenys
data = {
'age': [25, 30, 35, 40, 45, None],
'country': ['USA', 'Canada', 'USA', 'UK', 'Canada', 'USA'],
'salary': [50000, 60000, 70000, 80000, 90000, 55000],
'purchased': [0, 1, 0, 1, 0, 1]
}
df = pd.DataFrame(data)
# Apibrėžti požymius
numerical_features = ['age', 'salary']
categorical_features = ['country']
# Sukurti transformatorius
numerical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='mean')),
('scaler', StandardScaler())
])
categorical_transformer = Pipeline(steps=[
('onehot', OneHotEncoder(handle_unknown='ignore'))
])
# Sukurti išankstinio apdorojimo priemonę
preprocessor = ColumnTransformer(
transformers=[
('num', numerical_transformer, numerical_features),
('cat', categorical_transformer, categorical_features)
])
# Sukurti konvejerį
pipeline = Pipeline(steps=[('preprocessor', preprocessor),
('classifier', LogisticRegression())])
# Padalinti duomenis
X = df.drop('purchased', axis=1)
y = df['purchased']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Apmokyti modelį
pipeline.fit(X_train, y_train)
# Įvertinti modelį
score = pipeline.score(X_test, y_test)
print(f'Model accuracy: {score}')
Pažangesnės konvejerių technikos
Kai jaučiatės patogiai su pagrindais, galite tyrinėti pažangesnes konvejerių technikas:
1. Individualūs transformatoriai
Galite sukurti savo individualius transformatorius, kad atliktumėte specifines duomenų transformacijas, kurių nėra Scikit-learn. Norėdami sukurti individualų transformatorių, turite paveldėti iš TransformerMixin ir BaseEstimator klasių ir įgyvendinti fit bei transform metodus. Tai gali būti naudinga požymių inžinerijai ar specifinėms srities transformacijoms. Nepamirškite įtraukti tinkamų dokumentacijos eilučių (docstrings) dėl skaitomumo.
2. Požymių sujungimas (Feature Union)
FeatureUnion leidžia sujungti kelių transformatorių išvestį į vieną požymių vektorių. Tai gali būti naudinga, kai norite taikyti skirtingas transformacijas tiems pačiams požymiams arba sujungti požymius, kurie buvo transformuoti skirtingais būdais. FeatureUnion klasė naudojama kelių transformatorių išvesčiai sujungti į vieną požymių vektorių.
3. Tinklo paieška (Grid Search) su konvejeriais
Galite naudoti GridSearchCV, kad optimizuotumėte savo konvejerio hiperparametrus, įskaitant išankstinio apdorojimo žingsnių hiperparametrus. Tai leidžia automatiškai rasti geriausią išankstinio apdorojimo metodų ir modelio parametrų derinį. Būkite atsargūs dėl padidėjusių skaičiavimo kaštų.
Geriausios duomenų išankstinio apdorojimo konvejerių praktikos
Štai keletas geriausių praktikų, kurias reikėtų turėti omenyje kuriant duomenų išankstinio apdorojimo konvejerius:
- Supraskite savo duomenis: Prieš taikydami bet kokius išankstinio apdorojimo metodus, skirkite laiko suprasti savo duomenis. Ištirkite savo požymių pasiskirstymus, nustatykite trūkstamas vertes ir ieškokite išskirčių.
- Dokumentuokite savo konvejerį: Pridėkite komentarų prie savo kodo, kad paaiškintumėte kiekvieną konvejerio žingsnį. Tai padarys jūsų kodą lengviau suprantamą ir prižiūrimą.
- Testuokite savo konvejerį: Kruopščiai testuokite savo konvejerį, kad įsitikintumėte, jog jis veikia teisingai. Naudokite vienetinius testus (unit tests), kad patikrintumėte, ar kiekvienas konvejerio žingsnis duoda laukiamą rezultatą.
- Venkite duomenų nutekėjimo: Būkite atsargūs, kad išvengtumėte duomenų nutekėjimo apdorojant duomenis. Įsitikinkite, kad mokymo duomenims apdoroti naudojate tik informaciją iš mokymo duomenų. Naudokite konvejerius, kad užtikrintumėte nuoseklumą tarp mokymo ir testavimo duomenų.
- Stebėkite našumą: Stebėkite savo modelio našumą laikui bėgant ir, jei reikia, jį iš naujo apmokykite. Duomenų pasiskirstymai gali keistis, todėl svarbu periodiškai iš naujo įvertinti savo konvejerį ir prireikus atlikti pakeitimus.
Realaus pasaulio pavyzdžiai
Panagrinėkime keletą realaus pasaulio pavyzdžių, kaip duomenų transformacijos konvejeriai gali būti naudojami įvairiose pramonės šakose:
- Finansai: Kredito rizikos modeliavime konvejeriai gali būti naudojami klientų duomenims apdoroti, įskaitant skaitinius požymius, tokius kaip pajamos ir kredito balas, taip pat kategorinius požymius, tokius kaip užimtumo statusas ir paskolos tikslas. Trūkstamos vertės gali būti imputuojamos naudojant tokius metodus kaip vidurkio imputacija ar k-artimiausių kaimynų imputacija. Mastelio keitimas yra labai svarbus siekiant užtikrinti, kad skirtingo mastelio požymiai nedominuotų modelyje.
- Sveikatos apsauga: Medicininėje diagnostikoje konvejeriai gali būti naudojami pacientų duomenims apdoroti, įskaitant skaitinius požymius, tokius kaip amžius, kraujospūdis ir cholesterolio lygis, taip pat kategorinius požymius, tokius kaip lytis ir ligos istorija. „One-hot“ kodavimas gali būti naudojamas kategoriniams požymiams paversti skaitinėmis reikšmėmis.
- Elektroninė komercija: Produktų rekomendavimo sistemose konvejeriai gali būti naudojami klientų ir produktų duomenims apdoroti, įskaitant skaitinius požymius, tokius kaip pirkimo dažnumas ir produktų įvertinimai, taip pat kategorinius požymius, tokius kaip produktų kategorija ir klientų demografiniai duomenys. Konvejeriai gali apimti teksto apdorojimo žingsnius, tokius kaip tokenizacija ir stemming'as, siekiant išgauti požymius iš produktų aprašymų ir klientų atsiliepimų.
- Gamyba: Prognozuojamojoje techninėje priežiūroje konvejeriai gali būti naudojami mašinų jutiklių duomenims apdoroti, įskaitant skaitinius požymius, tokius kaip temperatūra, slėgis ir vibracija, taip pat kategorinius požymius, tokius kaip mašinos tipas ir veikimo sąlygos. RobustScaler čia gali būti ypač naudingas dėl galimų išskirtinių rodmenų.
Iššūkių sprendimas globaliuose duomenų rinkiniuose
Dirbant su globaliais duomenų rinkiniais, dažnai susidursite su specifiniais iššūkiais, kurie reikalauja kruopštaus apsvarstymo išankstinio apdorojimo metu. Štai keletas dažnų problemų ir strategijų joms spręsti:
- Skirtingi duomenų formatai: Datos, skaičiai ir valiutos gali turėti skirtingus formatus skirtinguose regionuose. Užtikrinkite nuoseklų analizavimą ir formatavimą. Pavyzdžiui, datos gali būti DD/MM/MMMM arba MM/DD/MMMM formatu. Naudokite atitinkamas bibliotekas datų konvertavimui ir formatavimui tvarkyti.
- Kalbos skirtumai: Teksto duomenys gali būti skirtingomis kalbomis, todėl gali prireikti vertimo arba kalbai specifinių išankstinio apdorojimo metodų. Apsvarstykite galimybę naudoti tokias bibliotekas kaip Google Translate API (atsižvelgiant į naudojimo sąlygas ir išlaidas) vertimui arba NLTK kalbai specifiniam teksto apdorojimui.
- Valiutų konvertavimas: Finansiniai duomenys gali būti skirtingomis valiutomis. Konvertuokite visas vertes į bendrą valiutą, naudodami naujausius valiutų kursus. Naudokite patikimas API, kad gautumėte tikslius ir realaus laiko valiutų kursus.
- Laiko juostos: Laiko eilučių duomenys gali būti įrašyti skirtingose laiko juostose. Konvertuokite visus laiko žymes į bendrą laiko juostą (pvz., UTC), kad užtikrintumėte nuoseklumą. Naudokite tokias bibliotekas kaip pytz laiko juostų konvertavimui tvarkyti.
- Kultūriniai skirtumai: Kultūriniai niuansai gali paveikti duomenų interpretaciją. Pavyzdžiui, klientų pasitenkinimo balai gali būti interpretuojami skirtingai įvairiose kultūrose. Būkite sąmoningi šių niuansų ir atsižvelkite į juos kurdami savo išankstinio apdorojimo žingsnius.
- Duomenų kokybės problemos: Duomenų kokybė gali labai skirtis priklausomai nuo skirtingų šaltinių. Įdiekite patikimas duomenų patvirtinimo ir valymo procedūras, kad nustatytumėte ir ištaisytumėte klaidas.
Išvada
Duomenų išankstinis apdorojimas yra kritinis mašininio mokymosi konvejerio žingsnis. Naudodami Scikit-learn konvejerius, galite supaprastinti savo darbo eigą, išvengti duomenų nutekėjimo ir pagerinti savo modelių našumą. Šių metodų įvaldymas leis jums kurti patikimesnius ir tvirtesnius mašininio mokymosi sprendimus įvairioms programoms. Nepamirškite pritaikyti išankstinio apdorojimo žingsnių pagal konkrečias jūsų duomenų savybes ir jūsų mašininio mokymosi modelio reikalavimus. Eksperimentuokite su skirtingomis technikomis, kad rastumėte optimalų derinį savo konkrečiai problemai. Investuodami laiką į tinkamą duomenų išankstinį apdorojimą, galite atskleisti visą savo mašininio mokymosi algoritmų potencialą ir pasiekti puikių rezultatų.